#pragma once

#include "viml/value.h"
#include <vector>

namespace viml {

// 数学运算函数
/**
 * abs(n) - 返回数字的绝对值
 * @param n Number/Float - 输入数字
 * @return Number/Float - 绝对值，类型与输入保持一致
 */
Value abs_builtin(const std::vector<Value>& args);

/**
 * sqrt(n) - 计算平方根
 * @param n Number/Float - 输入数字（必须非负）
 * @return Float - 平方根
 */
Value sqrt_builtin(const std::vector<Value>& args);

/**
 * pow(n, e) - 计算幂运算
 * @param n Number/Float - 底数
 * @param e Number/Float - 指数
 * @return Float - n的e次幂
 */
Value pow_builtin(const std::vector<Value>& args);

/**
 * exp(n) - 计算自然指数
 * @param n Number/Float - 指数
 * @return Float - e的n次方
 */
Value exp_builtin(const std::vector<Value>& args);

/**
 * log(n) - 计算自然对数
 * @param n Number/Float - 输入数字（必须为正数）
 * @return Float - 自然对数
 */
Value log_builtin(const std::vector<Value>& args);

/**
 * log10(n) - 计算以10为底的对数
 * @param n Number/Float - 输入数字（必须为正数）
 * @return Float - 以10为底的对数
 */
Value log10_builtin(const std::vector<Value>& args);

/**
 * sin(n) - 正弦函数
 * @param n Number/Float - 角度（弧度制）
 * @return Float - 正弦值
 */
Value sin_builtin(const std::vector<Value>& args);

/**
 * cos(n) - 余弦函数
 * @param n Number/Float - 角度（弧度制）
 * @return Float - 余弦值
 */
Value cos_builtin(const std::vector<Value>& args);

/**
 * tan(n) - 正切函数
 * @param n Number/Float - 角度（弧度制）
 * @return Float - 正切值
 */
Value tan_builtin(const std::vector<Value>& args);

// 数值转换函数
/**
 * float2nr(f) - 浮点数转整数（截断小数部分）
 * @param f Float - 浮点数
 * @return Number - 整数（截断小数部分）
 */
Value float2nr_builtin(const std::vector<Value>& args);

/**
 * str2nr(s) - 字符串转整数
 * @param s String - 字符串
 * @return Number - 整数（提取数字部分，忽略非数字字符）
 */
Value str2nr_builtin(const std::vector<Value>& args);

/**
 * str2float(s) - 字符串转浮点数
 * @param s String - 字符串
 * @return Float - 浮点数（支持科学计数法）
 */
Value str2float_builtin(const std::vector<Value>& args);

/**
 * string(n) - 数字转字符串
 * @param n Number/Float - 数字
 * @return String - 字符串表示
 */
Value string_math_builtin(const std::vector<Value>& args);

// 四舍五入与截断函数
/**
 * round(n) - 四舍五入到最接近的整数
 * @param n Number/Float - 输入数字
 * @return Float - 四舍五入后的整数值（但类型为Float）
 */
Value round_builtin(const std::vector<Value>& args);

/**
 * ceil(n) - 向上取整
 * @param n Number/Float - 输入数字
 * @return Float - 大于等于n的最小整数
 */
Value ceil_builtin(const std::vector<Value>& args);

/**
 * floor(n) - 向下取整
 * @param n Number/Float - 输入数字
 * @return Float - 小于等于n的最大整数
 */
Value floor_builtin(const std::vector<Value>& args);

/**
 * trunc(n) - 截断小数部分
 * @param n Number/Float - 输入数字
 * @return Float - 截断小数部分后的值
 */
Value trunc_builtin(const std::vector<Value>& args);

// 随机数与时间函数
/**
 * rand() - 生成随机整数
 * @return Number - 0到RAND_MAX范围的随机整数
 */
Value rand_builtin(const std::vector<Value>& args);

/**
 * srand(seed) - 设置随机种子
 * @param seed Number - 随机种子
 * @return Nil - 无返回值
 */
Value srand_builtin(const std::vector<Value>& args);

/**
 * localtime() - 获取当前时间
 * @return List - [年,月,日,时,分,秒,周几,年内天数]
 */
Value localtime_builtin(const std::vector<Value>& args);

/**
 * strftime(fmt) - 格式化时间字符串
 * @param fmt String - 时间格式字符串
 * @return String - 格式化后的时间字符串
 */
Value strftime_builtin(const std::vector<Value>& args);

// 其他实用函数
/**
 * fmod(n, m) - 浮点数取模
 * @param n Float - 被除数
 * @param m Float - 除数
 * @return Float - 浮点数取模结果
 */
Value fmod_builtin(const std::vector<Value>& args);

/**
 * hex(n) - 转换为十六进制字符串
 * @param n Number - 整数
 * @return String - 十六进制字符串（小写，无前缀）
 */
Value hex_builtin(const std::vector<Value>& args);

/**
 * oct(n) - 转换为八进制字符串
 * @param n Number - 整数
 * @return String - 八进制字符串（无前缀）
 */
Value oct_builtin(const std::vector<Value>& args);

} // namespace viml